package dlwntk6545.swing.outline;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class J01_HelloSwingFrame extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	
	/*
			
			Swing 개요
			desktop UI 를 개발할 때 사용하는 2가지 기술
			AWT(abstract window toolkit), Swing
			AWT : Java 1.0 부터 존재, 현재 Swing 으로 대채중
			Swing : AWT 의 제약을 극복하기 위해 발표 Java 1.2 부터 도입됨
					대표적인 기능은 lookandfeel 임
			그럼에도 불구하고, Java2D, Java3d 를 이용해서
			풍부한 그래픽 환경을 제공하려면 AWT 가 필요
			
			AWT vs Swing
			이 둘간의 차이점은 컴퍼넌트를 그리는 방법에 있음
			AWT 는 운영체제의 라이브러리를 이용
			따라서, AWT 로 작성된 프로그램은 윈도우와 리눅스에서 다르게 보임
			하지만, Swing 은 운영체제에 종속되지 않은 독립된 라이브러리를 이용
			따라서, Swing 을 이용한 프로그램은 윈도우나 리눅스에서든 똑같이 보임
			
			효과적인 UI 개발자가 되려면?
			UI 컴퍼넌트 : JFrame, JDialog, JPanel 등의
					      최상위 컨테이너와 여기에 추가할 수 있는 각종 컴퍼넌트
			배치 관리자 layout manager : 컨테이너를 컴퍼넌트에 배치하는 방법
			이벤트 처리 : 버튼 클릭, 마우스 이동, 크기조절등의 이벤트에 반응하는 코드 작성
			
			기본 스윙 컴퍼넌트
			스윙은 AWT 를 대체하며, GUI 기반 프로그램 작성을 위한 자바 기술임
			하지만, 여전히 AWT 관련 기술을 사용하고 있음
			스윙 컴퍼넌트는 javax.swing 패키지에 포함됨
			
			java.awt.Container	<- JComponent, java.awt.Window
			JComponent			<- AbstractButton, JComboBox, JLabel, JMenuBar, JPanel
			java.awt.Window		<- java.awt.Frame, java.awt.Dialog
			AbstractButton		<- JButton, JMenuItem
			java.awt.Frame		<- JFrame
			java.awt.Dialog		<- JDialog
			JMenuItem			<- JMenu
			
			위에서 보듯, AWT 와 스윙의 명백한 차이점은 스윙 컴퍼넌트의 이름에는 J라는 접두사가 있음
			
			2개의 차상위 컨테이너(JFrame, JDialog)를 제외하고 모든 스윙 컴퍼넌트는 반드시 컨테이너에 포함되어야 함
			일반적으로 모든 스윙 프로그램의 주 컨테이너는 JFrame 임(뽀인트)
			
			JFrame
			스윙 차상위 컨테이너 중에서 하나
			다른 컴퍼넌트들을 여기에 배치하려면 add 메서드를 호출
			JFrame 은 단 하나의 자식요소인 JRootPane 을 가지고 있음
			따라서, 컴퍼넌트를 추가하는 코드는 frame명.getContentPane().add(컴퍼넌트) 임
			또한, JFrame 객체를 화면에 나타내기 위해 pack(), setVisible() 메서드를 사용함
			pack() : 자식 컴퍼넌트에 따라 프레임 크기 조절
			setVisible() : JFrame 표시 여부 지정
			JFrame 을 화면에서 지우려면 dispose() 메서드 호출
			
			한편, JFrame 의 window 영역에는 title bar 와 content pane 등의 2개의 영역으로 구분
			content pane 은 JFrame 에 의해 생성되는 또 다른 객체임
			일반적으로  JPanel 을 content pane 으로 사용함
			
	*/
	public static void main(String[] args) {
				//JDK 6+ 에서 스윙 프로그램은 invokeLater 메서드를 이용해서
				//JFrame 을 호출하도록 작성하는 것을 추천
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					J01_HelloSwingFrame frame = new J01_HelloSwingFrame();
					frame.setVisible(true);
					//생성한 JFrame 을 화면에 띄움
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public J01_HelloSwingFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//닫기 버튼을 눌렀을때 처리할 내용
		//EXIT_ON_CLOSE : system.exit() 호출후 프로그램 종료
		//위 기능 외의 것을 처리할려면 DO_NOTHING_ON_CLOSE 를 이용해야 함
		setBounds(100, 100, 450, 300);
		//pack() 메서드의 대체재 JFrame 의 크기를 변경할때 자주 사용
		//주의 : setVisible 이 호출되기전에 먼저 호출
		//setBounds(x 위치, y 위치, 너비, 높이)
		//setSize(너비, 높이)
		setResizable(false);
		//JFrame 의 크기조절 불가
		setTitle("어서일어나");
		//JFrame 제목 지정
		
		//JFrame 에 컴퍼넌트를 배치하기 위해 JPanel 을 하나 생성해서 content pane 에 지정함
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		//JPanel 의 상하 좌우 여백(padding) 지정 방향은 상우하좌(시계 방향)
		contentPane.setLayout(new BorderLayout(0, 0));
		//컴퍼넌트 배치 방법을 지정
		//borderLayout : 5개 영역으로 구분해 배치
			//영역 구성     : 동서남북,중앙
		setContentPane(contentPane);
	}

}
